package com.bbs.common;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@ComponentScan({"com.bbs.common.web", "com.bbs.common.service"})
@MapperScan("com.bbs.common.mapper")
public class CommonConfiguration implements WebMvcConfigurer {

    // value注解是调用application中的参数
    @Value("${file.image.path}")
    private String imagePath;

    // 配置跨域（因为是前后端分离项目）
    @Bean
    public CorsFilter corsFilter() {
        // 映射路径
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // cors配置信息
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("http://localhost:8091"); // 1 设置访问源地址
        corsConfiguration.addAllowedOrigin("http://localhost:8092"); // 1 设置访问源地址
//        corsConfiguration.addAllowedOrigin("*"); // 1.1 设置访问源地址
//        corsConfiguration.allowedOriginPatterns("*"); // 1.2 设置访问源地址
        corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
        corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法
        corsConfiguration.addExposedHeader("*"); // 暴露哪些头部信息
        // 当你在 CORS 配置中将 allowCredentials 设置为 true 时，allowedOrigins 不能包含特殊值 "*"。这是因为 "*" 不能与带有凭据的请求一起使用。
        // 因此不能直接用1.1 可以用1.2但是该属性私有，也不能用 ？如何优化
        corsConfiguration.setAllowCredentials(true); // 是否发送cookie
        source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置
        return new CorsFilter(source);
    }

    // mybatis-plus的分页插件
    @Bean
    public MybatisPlusInterceptor paginationInterceptor() {
        // 创建一个MybatisPlus的拦截器，做mysql查询时都会被拦截器处理
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 定义一个分页拦截器
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }

//    @Override
//    public void configurePathMatch(PathMatchConfigurer configurer) {
//        // 指定controller统一的接口前缀 相当于在url上拼了一个/api前缀
//        // 要在前端utils/request.js的baseURL中加/api
//        configurer.addPathPrefix("/api", clazz -> clazz.isAnnotationPresent(RestController.class));
//    }

    // 静态资源目录
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 其中image表示访问的前缀，
        registry.addResourceHandler("/image/**").addResourceLocations("file:" + imagePath);
    }
}
